<?php
namespace Home\Controller;
use Think\Controller;
defined('IN_ECTOUCH') or die('Deny Access');
require_once('WxMoneyPay.class.php');
class MoneyPayController extends CommonController {
    private $data;
	protected $user_id;
	protected $mobile_phone;
    protected $token;
    protected $info;

    public function __construct()
    {
        // 获取参数
       parent::__construct();

       $this->info=$this->common_info;
        // 验证登录
        $this->check_login();
	}
     private function check_login() {
        //检测是否登录 token是否过期
        $Users=D('Users');
        $token=I('post.token');
        
        
        $info=$this->info;

        if(!$info['user_id'])return_data(20000,'需要先登录',$_POST);
        else
        {
            $this->info=$info;
            $this->user_id=$info['user_id'];
            $this->mobile_phone=$info['mobile_phone'];
            $this->token=$info['token'];
        }

     }
	 /**
     * 微信App付款
     * @param  [string] $openid [description]
     * @param  [int] $total  [description]
     * @return [array]         [description]
     */
	public function appPrepaySign() {
		/*************测试*************开始***/
		// $_POST['order_id']=70;
		// $this->user_id=8;

		// $_POST['order_id']=96;
		// $this->user_id=3;

		/*************测试*************结束***/

		 $order_id=I('post.order_id',0,'int');
		 $user_id=$this->user_id;


		 if(!$order_id)return_data(20001,'没有指向订单');
        
         //查看订单
		 $order=M('order_info')->field("order_sn,order_amount,pay_status")->where("user_id='$user_id' and order_id='$order_id'")->find();
		 if(!$order)return_data(20002,'不存在该订单');


		 //判断订单情况
		 if($order['pay_status']==2 || $order['order_amount']<=0) return_data(60000,'重复提交，订单已支付过');

		 //判断重复提交支付
		 $pay_log=M('pay_log')->field('log_id,order_amount,is_paid')->where("discarded_status=0 and order_id='$order_id'")->find();

		 //prepay_id 有2小时有效--可以进一步处理

		 if($pay_log)
		 {
		 	$log_id=$pay_log['log_id'];
		 	if($pay_log['is_paid']>0)
		 	{
               return_data(60000,'重复提交，订单已支付过');
		 	}
		 	else if($pay_log['order_amount']!=$order['order_amount'])//危险操作
		 	{
                //订单价格变动--废弃订单
		 		$up_data['discarded_status']=1;
		 		$up_log=M('pay_log')->where("log_id='$log_id'")->save($up_data);
		 	}
		 }

		 if($up_log || !$pay_log) //插入支付日志
		 {
		 	 $add_data=array();
             $add_data['order_id']=$order_id;
             $add_data['order_amount']=$order['order_amount'];
             $add_data['order_type']=0;
             $add_data['is_paid']=0;
             $log_id=M('pay_log')->add($add_data);
		 }


        
        //参数处理
		$input['out_trade_no']=$order['order_sn'].'O'.$log_id;//订单号-必填
		$input['total_fee']=$order['order_amount'];
		$input['body']='锦绣天地的商品';//商品或支付单简要描述-必填



		 //执行签名
		  $result = WxMoneyPay::getAppSign($input);


		  if($result['prepayid'])
	      {
	        return_data(0,'签名构造成功',$result);
	      }
	      else
	      {
	         return_data(20002,'签名构造失败',$result);
	      }
	}

	
	/**
	 * 输出xml字符
	 * @throws WxPayException
	**/
	public function ToXml($values)
	{

		
		if(!is_array($values) 
			|| count($values) <= 0)
		{
    		// throw new WxPayException("数组数据异常！");
    		return false;
    	}
    	
    	$xml = "<xml>";
    	foreach ($values as $key=>$val)
    	{

    		if(empty($val))continue;

    		if (is_numeric($val)){
    			$xml.="<".$key.">".$val."</".$key.">";
    		}else{
    			$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
    		}
        }
        $xml.="</xml>";
        return $xml; 
	}

 //支付宝支付  签名
  public function doalipay(){
         /*************测试*************开始***/
		// $_POST['order_id']=89;
		/*************测试*************结束***/

         Vendor('Alipay.Corefunction');
         Vendor('Alipay.Rsafunction');

         $alipay_config=C('alipay_config');

		 $order_id=I('post.order_id',0,'int');
		  $user_id=$this->user_id;


		 if(!$order_id)return_data(20001,'没有指向订单');
        
         //查看订单
		 $order=M('order_info')->field("order_sn,order_amount,pay_status")->where("user_id='$user_id' and order_id='$order_id'")->find();
		 if(!$order)return_data(20002,'不存在该订单');


		 //判断订单情况
		 if($order['pay_status']==2 || $order['order_amount']<=0) return_data(60000,'重复提交，订单已支付过');

		 //判断重复提交支付
		 $pay_log=M('pay_log')->field('log_id,order_amount,is_paid')->where("discarded_status=0 and order_id='$order_id'")->find();

		 //prepay_id 有2小时有效--可以进一步处理

		 if($pay_log)
		 {
		 	$log_id=$pay_log['log_id'];
		 	if($pay_log['is_paid']>0)
		 	{
               return_data(60000,'重复提交，订单已支付过');
		 	}
		 	else if($pay_log['order_amount']!=$order['order_amount'])//危险操作
		 	{
                //订单价格变动--废弃订单
		 		$up_data['discarded_status']=1;
		 		$up_log=M('pay_log')->where("log_id='$log_id'")->save($up_data);
		 	}
		 }

		 if($up_log || !$pay_log) //插入支付日志
		 {
		 	 $add_data=array();
             $add_data['order_id']=$order_id;
             $add_data['order_amount']=$order['order_amount'];
             $add_data['order_type']=0;
             $add_data['is_paid']=0;
             $log_id=M('pay_log')->add($add_data);
		 }

 
        /**************************请求参数**************************/
        $payment_type = "1"; //支付类型 //必填，不能修改
        $notify_url = $alipay_config["notify_url"]; //服务器异步通知页面路径
        $seller_id = $alipay_config["seller_id"];//卖家支付宝帐户必填
        $out_trade_no = $order['order_sn'].'O'.$log_id;//商户订单号 通过支付页面的表单进行传递，注意要唯一！
        $subject = '锦绣天地的商品';  //订单名称 //必填 通过支付页面的表单进行传递
        $total_fee =  $order['order_amount'];   //付款金额  //必填 通过支付页面的表单进行传递
        $body = '锦绣天地的商品';  //订单描述 通过支付页面的表单进行传递

        /************************************************************/
    
        //构造要请求的参数数组，无需改动
	    $parameter = array(
	        "service" => "mobile.securitypay.pay",
	        "partner" => trim($alipay_config['partner']),	   
	         "_input_charset"    => trim(strtolower($alipay_config['input_charset'])),
	         "sign_type"=>trim($alipay_config['sign_type']),
	        "sign"=>'',
	        "notify_url"    => $notify_url,
	        "out_trade_no"    => $out_trade_no,
	        "subject"    => $subject,
	        "payment_type"    => $payment_type, 
	        "seller_id"    => $seller_id,
	         "total_fee"    => $total_fee,
	         "body"            => $body
	      );
		//除去待签名参数数组中的空值和签名参数
		$para_filter = paraFilter($parameter);
		
		//对待签名参数数组排序
		$para_sort = argSort($para_filter);
	    $link_str=createLinkstringUrlencode($para_sort);
	    $sign=rsaSign($link_str, trim($alipay_config['private_key_path']));
	    $parameter['sign']=$sign;
	    if($sign)
	    return_data(0,'构造支付宝支付参数成功',$parameter);
	     else
		 return_data(10003,'构造支付宝支付参数失败',$parameter);


  }
	




 
}